#include <iostream>
#include <unordered_map>
#include <string>
#include <utility>

using std::cout;
using std::endl;
using std::unordered_multimap;
using std::string;
using std::pair;
using std::make_pair;

template <typename Container>
void display(const Container &con)
{
    for(auto &elem : con)
    {
        cout << elem.first 
             << "  " 
             << elem.second << endl;
    }
}

void test()
{
    //unordered_multimap的基本特征
    //1、存放的是key-value类型，key值是不唯一的，可以重复，但是value值既可以重复
    //也可以不重复
    //2、key值是没有顺序的
    //3、底层使用的是哈希表
    unordered_multimap<int, string> number = {
        {1, "北京"},//1、构建大括号构建pair类型
        {3, "南京"},
        pair<int, string>(4, "武汉"),//2、使用pair的对象进行构建
        pair<int, string>(2, "武汉"),
        make_pair(5, "天津"),//3、使用make_pair构建pair类型
        make_pair(3, "湖南")
    };
    display(number);

    cout << endl << "unordered_multimap的查找" << endl;
    size_t cnt = number.count(3);
    cout << "cnt = " << cnt << endl;

    unordered_multimap<int, string>::iterator it = number.find(2);
    if(it == number.end())
    {
        cout << "该元素不存在unordered_multimap中: " << endl;
    }
    else
    {
        cout << "该元素存在unordered_multimap中 " 
             << it->first
             << "   " << it->second
             << endl;
    }

    cout << endl << "unordered_multimap的insert操作" << endl;
    number.insert(make_pair(6, "东京"));
    /* number.insert({6, "东京"}); */
    /* number.insert(pair<int, string>(6, "东京")); */
    display(number);

    cout << endl << endl;
    number.insert({ {7, "王道" }, make_pair(9, "湖北")});
    display(number);

#if 0
    cout << endl <<"unordered_multimap的下标操作" << endl;
    cout << "number[4] = " << number[4] << endl;//查找
    cout << "number[8] = " << number[8] << endl;//插入
    display(number);

    cout << endl << endl;
    /* T &operator[](const Key &key) */
    number[8] = "重庆";//修改
    number[7] = "上海";
    /* number.operator[](7).operator=("上海"); */
    display(number);

    
    //unordered_multimap的下标是没有重载const版本的，所以const的unordered_multimap是不能调用下标
    /* const unordered_multimap<int, string> mm ={ {1, "wangdao"} }; */
    /* mm[1];//error */
#endif
}

int main(int argc, char *argv[])
{
    test();
    return 0;
}

